const bcrypt= require('bcryptjs')
const db= require('../db/index')
const jwt= require('jsonwebtoken')
const config= require('../config');
let login=(req,res)=>{
    // 1.验证用户名密码格式是否正确
    // 2.验证用户名是否存在
    const useStr='select * from ev_users where username=?'
    db.query(useStr,req.body.username,(err,results)=>{
        if (err) {
            return res.cc(err.message);
        }
        if (results.length==0) {
            return res.cc('用户名不存在')
        }
        // 3.判断密码是否正确 用到compareSync解析密码 与原密码做判断 正确为true
        const compareResult=bcrypt.compareSync(req.body.password,results[0].password);
        if(!compareResult) return res.cc('登陆失败')
        // 4.登陆成功生成token
        const user={...results[0],password:'',user_pic:''};
       const tokenstr= jwt.sign(user,config.jwtSecretKey,{
            expiresIn: '10h',
        });
        // 成功返回 在tokenstr前手动拼接上 bearer 加空格
        res.send({
            status:0,
            message:'登陆成功',
            token:'Bearer '+tokenstr
        });
    })
}
let reguser=(req,res)=>{
       /*1. 检测表单数据是否合法
       */ 
       const userinfo=req.body;
       console.log(userinfo);
        // if (!userinfo.username || !userinfo.password) {
        //     // 使用封装的res.cc时就相当于利用了中间件的监听 只要我们调用res.cc就可以执行我们封装的中间件 像是函数的封装
        //     return res.cc('用户名和密码不能为空');
        // }
       
        // 2. 检测用户名是否被占用
        const useStr='select * from ev_users where username=?'
        db.query(useStr,userinfo.username,(err,result)=>{
            // 判断语法正确
            if (err) {
                return res.cc(err)
            }
            if(result.length!=0){
                return res.cc('用户名已存在');
            }
            // 3. 对密码进行加密处理
            userinfo.password=bcrypt.hashSync(userinfo.password,10);
            // 4. 插入用户信息 这里根据const的特性所以不是一个userStr
            const useStr='insert into ev_users set ?'
            // 交互函数
            db.query(useStr,{username:req.body.username,password:req.body.password},(err,results)=>{
                // 语法错误
                if (err) {
                    return res.cc('注册失败')
                }
                // 语法成功但是影响行数不是1
                if (results.affectedRows!==1) {
                    return res.cc('注册失败')
                }
                // 成功
                res.cc('注册成功',0)
            })

        });

}
module.exports ={
    reguser,
    login
}